草庐IT

GCD ③ dispatch_barrier

全部标签

ios - 是否有 GCD 等同于设置可以取消并在以后重新安排的计时器?

我有一些代码使用了大量的GCD代码。我需要实现一种在延迟一段时间后安排工作单元的方法,但可以取消并在需要时进一步移出。考虑一个点击处理程序;区分单击和双击的东西。为此,需要获取点击事件,并设置一个短计时器来对其进行操作。如果在计时器触发之前发生另一个点击事件,它将被取消并重新开始。当计时器最终触发时,它会发出正确的点击次数。无论如何,这很容易用NSTimers或NSObject上的performSelector实现。也许像NSUIntegertapCount=0;-(void)handleClickEvent{[NSObjectcancelPreviousPerformRequests

ios - 如何在 GCD block 中返回当前方法?

这是我的代码:-(void)viewDidLoad{[superviewDidLoad];[selftestGCD];}-(void)testGCD{staticdispatch_once_tonceToken;dispatch_once(&onceToken,^{NSLog(@"1");return;});NSLog(@"2");}控制台打印出1和2。我想要的只是第一次打印1。我认为return可能不是从方法返回,而是从block返回。有什么方法可以从这个GCDblock中的当前方法返回吗? 最佳答案 使用block来解决问题。-

ios - 为什么 dispatch_async 不好?完成相同任务的更好方法是什么?

dispatch_async(dispatch_get_main_queue(),^{[self.teamNamebecomeFirstResponder];});我和一个friend聊天,他告诉我他听说使用dispatch_async不是很好,但他不确定为什么。我在谷歌上查了下,没有发现这段代码错误的原因我如何改进这段代码?有没有更好的方法来做到这一点?注意:我还在学习iOS编程,所以我对这整件事都是陌生的。 最佳答案 您的friend错误地认为dispatch_async是“坏的”。但是要求另一个处理器做像becomeFirst

ios - 了解后台任务执行语法和 GCD

在研究iOS中的后台任务后,我试图完全理解我放在一起的以下代码,希望能得到一些帮助,我理解基本概念,首先我们获取应用程序单例,然后我们创建一个block并向系统注册后台任务,最后我们异步调度任务运行。下面是我正在寻求帮助的部分:当background_task被分配block时,实际block中没有我们想要运行的代码,只有完成处理程序中的清理代码,这是为什么?我理解dispatch_async基本上启动了一个新线程并开始处理block中的代码,但是在这个dispatch_async请求中哪里引用了background_task?我看不出系统是怎么理解我们在dispatch_async请

ios - iOS 中的 GCD 总是创建新线程

我有很多这样的代码:dispatch_async(dispatch_get_global_queue(0,0),^{});dispatch_async将在我调用一次时创建一个新线程。当应用程序运行一段时间后,我得到了很多线程:数字50、60、70。这不是很好。如何重用这些线程。喜欢tableview.dequeueReusableCellWithIdentifier这是我的代码。下载后需要做一些图片拼接,然后保存。-(void)sdImageWith:(NSString*)urlStringsaveIn:(NSString*)savePathcompletion:(completion

ios - 必须分派(dispatch)到 iOS 11 中的主线程

在iOS11之前,我能够动态地重新加载TableView数据,而无需将重新加载分派(dispatch)到主线程。但是,现在我正在安装了iOS11的设备上进行测试,似乎我必须将每个UI更新分派(dispatch)到主线程才能使其正常工作。否则我最终会得到空的UI元素。即具有所有行但没有标签的TableView,或没有标题的按钮等。有谁知道iOS11中发生了什么变化要求这样做?有办法关闭它吗? 最佳答案 从远古时代开始,Apple就强调所有与UI元素的交互必须发生在主/GUI线程上。不听从这个建议会导致奇怪的行为:有时它会工作正常,其他

ios - dispatch_async 用于从 url 获取许多图像

我想从不同的url获取许多图像并将其设置为图像的按钮。我试图像上面显示的那样执行此操作,但没有任何反应。当我访问这个ViewController时,它没有任何按钮图像,也没有显示横幅View...。dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^(void){NSURL*url=[NSURLURLWithString:[pictureUrlobjectAtIndex:i]];NSData*data=[[NSDataalloc]initWithContentsOfURL:url];d

iOS - 调用 dispatch_async 时没有堆栈跟踪

我已经创建了一些示例代码来演示我的问题。-(void)test{void(^handler)(void)=^{NSArray*test=[NSArrayarray];[testobjectAtIndex:5];};handler=[handlercopy];dispatch_async(dispatch_get_main_queue(),handler);}当我调用测试方法时,我没有得到堆栈跟踪。调试器停在main.m并突出显示此行intretVal=UIApplicationMain(argc,argv,nil,NSStringFromClass([FantasyUniversalA

ios - 在 GCD 中,有没有办法判断当前队列是否并发?

在GCD中,有没有办法判断当前队列是否并发?我目前正在尝试对某些托管对象上下文执行延迟保存,但我需要确保当前执行代码的队列是线程安全的(在同步队列中)。 最佳答案 如果您实际上必须确定传递给您的队列是串行的还是并发的,那么几乎可以肯定您的设计有误。通常,API会将内部队列隐藏为实现细节(在您的情况下为共享对象上下文),然后针对其内部队列对操作进行排队,以实现线程安全。但是,当您的API将block和队列作为参数时,假设传入的block可以针对传递的队列安全地调度(异步)(例如,当操作完成时)和其余部分代码被适当分解。

ios - 使用 GCD 复制大文件 - Dispatch IO 消耗大量内存

我正在将大型文件复制操作从NSStream转换为使用GCD的调度IO实现。当将两个1GB的文件一起复制到一个2GB的文件中时,应用程序使用GCD会消耗2GB的内存。NSStream实现仅占用50MB。在Instruments中,我可以看到start_wqthread调用分配了1MBblock,正如我为调度IO高水位线请求的block大小,但在写入输出流后没有被释放,他们四处闲逛。缓冲区写入输出流后如何释放缓冲区?如果我在Xcode中创建一个全新的OSXCocoa应用程序并将以下代码粘贴到applicationDidFinishLaunching:方法中,它将消耗500-2000MB的内